package com.dxf.chepter08

import scala.collection.mutable
import scala.collection.mutable.ListBuffer

/**
 *
 *  Map散列表 (数组+链表)
 *
 *    Java中的HashMap无序的
 *
 *
 *    ========================
 *
 * 不可变的map:
 *   1  scala中 构建不可变的map (有序的),底层是 Tuple2
 *   2 默认Map是不可变的map
 *   3 key -> value 类型可以任意写
 *   4 不可变的顺序看到的结果和输入的一直
 *    val map1 = Map("Alice" -> 10,"Bob" -> 20, "Kotlin" -> "北京")
 *
 *
 *
 *
 * 可变的map:
 *
 *   可变的map要指定bao mutable.Map
 *
 *
 *   1 map取值方式:
 *    1.1如果我们确定map有这个key 用 map(key) 方式
 *    1.2如果我们不确定map是否有这个key,而且有不用的业务逻辑,用map.contains(),先判断再加入逻辑
 *    1.3如果只是简单的希望得到一个值,用 map.getOrElse("ip","127.0.0.1") ,
 *
 *
 * =========================================
 *
 *  map修改添加删除
 *
 *  修改添加 ,如果key存在则修改,如果key不存在则添加
 *
 *  map(key) =value   修改添加
 *
 *
 *  删除:
 *
 *    map -=(key)
 *    删除,如果key不存在,会报错
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
object T88_Map {


  def main(args: Array[String]): Unit = {

    //不可变的顺序看到的结果和输入的一直
    val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
    println(map1)
    //=======================

    //可变类型

    var map2 = mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
    println(map2)

    //空映射
    val map3 = new mutable.HashMap[String, Int]
    println(map3)

    // 二元祖的形式创建可变Map
    var map4 = mutable.Map(("Alice", 10), ("Bob", 20), ("Kotlin", "北京"))
    println(map4)


    // ===============取值======================

    //1
    println(map4("Bob")) //20

    //2
    // println(map4("xxx"))// NoSuchElementException: key not found: xxx
    if (map4.contains("xxx")) {
      println(map4("xxx"))
    } else (
      println("key不存在")
      )
    //取值3 使用map.get()
    //如果key存在,返回Some(值),然后就可以取出值,否则None
    println(map4.get("xxx")) //None
    println(map4.get("xxx") == None) //true
    println(map4.get("Bob")) //Some(20)

    //4 获取key,根据key获取value,如果key不存在,返回默认值 default

    println(map4.getOrElse("Bob", "default"))
    println(map4.getOrElse("xxx", "default"))

    // =================================================
    println("==========================================")

    //修改添加删除

    var map5 = mutable.Map(("Alice", 10), ("Bob", 20), ("Kotlin", "北京"))
    map5("AA") = 30 //添加
    println(map5)

    map5("AA") = 40 //修改
    println(map5)

    map5 += ("d" -> 4, "AA" -> 45) //也是添加或者修改
    println(map5)

    map5 -= "AA" //删除1个key
    println(map5)

    map5 = map5 - ("AA", "d") //删除多个key,key可以不存在
    println(map5)


    //=========================================
    println(
      "========================================="
    )

    //map的遍历


    val map6 = mutable.Map(("Alice", 10), ("Bob", 20), ("Kotlin", "北京"))
    //1
    for ((k, v) <- map6) {
      println(k + " -> " + v)
    }
    //2
    for (k <- map6.keys) {
      println( k+"value"+ map6(k))
    }
    //3
    for (v <- map6.values) {
      println( v)
    }
    //4
    for (v <- map6) {
      println( v+" key ="+v._1+" value="+v._2)
    }
  }


}

